Eingabe durch eine Prüfziffer validieren

[Dies ist ein Fallbeispiel, das in einem separaten Fenster angezeigt wird. So können Sie das Beispiel und ein beliebiges anderes Hilfethema gleichzeitig betrachten. Das Fenster des Fallbeispiels lässt sich verschieben, in seiner Grösse ändern und über das Schliessfeld verlassen]

Benutzereingaben sind fehleranfällig. Damit eine fehlerhafte Eingabe später keinen Schaden anrichtet, prüft der Entwickler am besten früh, ob die Eingabe regelkonform ist. MS Access lässt Sie deshalb bereits bei der Definition eines Formulars oder Steuerelements Gültigkeitsregeln formulieren. Die Gültigkeitsregel >="A" Und <="Z" stellt zum Beispiel sicher, dass die Bearbeiterin einer Zuordnungsaufgabe nur Buchstabenpräfices zwischen A und Z eingibt. Für ein konkretes Beispiel markieren Sie das Feld TxfBuchstabenpräfix des Unterformulars Subfrm Buchstabenalternativen, drücken »Alt/Enter und lesen den Wert der Eigenschaft Gültigkeitsregel.

Komplexe Gültigkeitsprüfungen müssen in VBA programmiert werden. Ein Beispiel ist die Validierung einer Matrikelnummer der Schweizer Universitäten. Die Matrikelnummer identifiziert jeden Studierenden zeitlich und räumlich eindeutig. Ihren Aufbau zeigt das folgende Beispiel. Gegeben sei die Matrikelnummer 72-836-596. Die einzelnen Ziffern haben die folgende Bedeutung:

Die Prüfziffer berechnet sich wie folgt:

  1. Verdopple die ungeraden Ziffern der Matrikelnummer
  2. Stelle die zweistelligen Verdopplungsergebnisse aus Schritt 1 als Quersummen dar (z.B. 5 statt 14)
  3. Berechne die Quersumme der prüfzifferlosen Matrikelnummer 
  4. Subtrahiere die Quersumme von ihrer nächst grösseren Zehnerzahl

Am Beispiel 72-836-596 lautet der Rechenweg:

  1. 14, 2, 16, 3, 12, 5, 18  (Verdoppelung)
  2. 5, 2, 7, 3, 3, 5, 9  (Quersummen)
  3. 5 + 2 + 7 + 3 + 3 + 5 + 9 = 34  (Quersumme)
  4. 40 - 34 = 6 ist die Prüfziffer  (Subtraktion)

Aus dem 4. Schritt ergibt sich die folgende Bedingung einer Matrikelnummer: "Die Summe aus Quersumme und Prüfziffer ist immer eine Zehnerzahl". Wir verwenden dies in der folgenden Funktion. Der VBA-Code geht nach den vier Schritten vor, ist aber komplexer als die entwurfssprachliche Lösung, weil er einige ungewohnte Funktionen und Operatoren verwendet und ausserdem temporäre Zwischenergebnisse im Datenfeld TmpMatr(1 To 7)verwaltet.

Private Function MatrikelGültig(ByVal Matrikel As String) As Boolean
  Dim TmpMatr(1 To 7) As String      'Zwischenspeicherung der Prüfziffer-losen Matrikel
  Dim i As Byte 'Index i läuft im Datenfeld TmpMatr von 1 bis 7
  Dim Zahl, Quersumme As Byte

  If Len(Matrikel) = 8 Then          'Alle Matrikelnummern sind 8 Zeichen lang
    Quersumme = 0
    For i = 1 To 7                   'ohne Prüfziffer
      If i Mod 2 <> 0 Then           '*** ungerade Ziffer
        '1. Ziffer verdoppeln
        TmpMatr(i) = CStr(CInt(Mid(Matrikel, i, 1)) * 2)
        '2. Zweistellige Verdoppelung als Quersumme darstellen
        If Len(TmpMatr(i)) > 1 Then
          TmpMatr(i) = CStr(CInt(Left(TmpMatr(i),1)) + CInt(Right(TmpMatr(i),1)))
        End If
      Else                           '*** gerade Ziffer
        TmpMatr(i) = Mid(Matrikel, i, 1)
      End If
      '3. Quersumme der Matrikel ohne Prüfziffer berechnen
      Quersumme = Quersumme + CInt(TmpMatr(i))
    Next
    '-- 4. Ist (Quersumme + Prüfziffer) eine Zehnerzahl?
    If (Quersumme + CInt(Right(Matrikel, 1))) Mod 10 = 0 Then
      MatrikelGültig = True
      Exit Function
    End If
  End If
  MatrikelGültig = False
End Function

Verwendete vordefinierte Funktionen
len(Zeichenkette) berechnet die Anzahl Zeichen der Zeichenkette (string)
mid(Zeichenkette, i+1, 1) ergibt das i+i-te Zeichen der Zeichenkette
left(Zeichenkette, 1) ergibt das erste Zeichen der Zeichenkette
right(Zeichenkette, 1) ergibt das letzte Zeichen der Zeichenkette
Dividend mod Divisor ergibt den ganzzahligen Rest der Division von Dividend durch Divisor
CByte(Zeichenkette) ergibt den Byte-Wert (0 bis 255) der Zeichenkette
CStr(Zahl) ergibt den Str-Wert der Zahl